#include <cv.h>
#include <highgui.h>

#include "faceDetector.h"

using namespace cv;

int main( int argc, char** argv )
{
    Mat src;
    if( argc != 2 || !(src=imread(argv[1], 1)).data )
        return -1;
	
    Mat hsvFullSize;
    cvtColor(src, hsvFullSize, CV_BGR2HSV);
	
	FaceDetector* fd = new FaceDetector(1.0);
	
	vector<Rect>* faces = fd->detectFace(src);
	
	if (!faces->empty()) {
		
		Rect faceRect = faces->front();
		
		rectangle( src, Point( faceRect.x, faceRect.y ), //WAD bug : cvRectangle instead
				  Point( faceRect.x+faceRect.width, faceRect.y + faceRect.height ),
				  Scalar::all(0),
				  2);
	
		Mat hsvFace( hsvFullSize, faceRect );
		
		// let's quantize the hue to 30 levels
		// and the saturation to 32 levels
		int hbins = 30, sbins = 32;
		int histSize[] = {hbins, sbins};
		// hue varies from 0 to 179, see cvtColor
		float hranges[] = { 0, 180 };
		// saturation varies from 0 (black-gray-white) to
		// 255 (pure spectrum color)
		float sranges[] = { 0, 256 };
		const float* ranges[] = { hranges, sranges };
		MatND hist;
		// we compute the histogram from the 0-th and 1-st channels
		int channels[] = {0, 1};
		//int *channels2 = &channels[0];
		
		calcHist( &hsvFace, 1, channels, Mat(), // do not use mask
				 hist, 2, histSize, ranges,
				 true, // the histogram is uniform
				 false );
		double maxVal = 0;
		minMaxLoc(hist, 0, &maxVal, 0, 0);
		
		int scale = 10;
		Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
		
		for( int h = 0; h < hbins; h++ )
			for( int s = 0; s < sbins; s++ )
			{
				float binVal = hist.at<float>(h, s);
				int intensity = cvRound(binVal*255/maxVal); //WAS bug : maxValue instead of maxVal
				rectangle( histImg, Point(h*scale, s*scale), //WAD bug : cvRectangle instead
							Point( (h+1)*scale - 1, (s+1)*scale - 1),
							Scalar::all(intensity),
							CV_FILLED );
			}
		
		//Back proj
		
		Mat backProj = Mat::zeros(src.cols, src.rows, CV_8UC1);
		
		calcBackProject( &hsvFullSize, 1, channels, hist, backProj, ranges, 1.0, true);
//		calcHist( &hsvFace, 1, channels, Mat(), // do not use mask
//				 hist, 2, histSize, ranges,
//				 true, // the histogram is uniform
//				 false );
		
		namedWindow( "Source", 1 );
		imshow( "Source", src );
		
		namedWindow( "H-S Histogram", 1 );
		imshow( "H-S Histogram", histImg );
		
		namedWindow( "BackProj", 1 );
		imshow( "BackProj", backProj );
		
		waitKey();
		
		
		
	} else {
		
		std::cout << "no face found" << std::endl;
		
	}
}
